from rest_framework import serializers
from api import models

class NewCategorySerializers(serializers.ModelSerializer):
    class Meta:
        model = models.Category
        fields = '__all__'
        # fields = ['id',]

class ArticleSerializers(serializers.ModelSerializer):
    '''
    使接口返回自己特定的值，比如连表查询
    '''
    # 第二种方法，source值后面跟 【表名.字段名】，同时fields中添加此字段
    x1 = serializers.CharField(source='category.name', required=False)
    # 第三种方法，定义一个钩子方法get_x2就是定义的钩子方法
    x2 = serializers.SerializerMethodField()
    # 这个看似完美，但里面其实有个错误。我们定义了一个仅可读的status字段把原来的status字段覆盖了
    # ，这样反序列化时用户将不能再对文章发表状态进行修改（原来的status字段是可读可修改的）。
    # 一个更好的方式在ArticleSerializer新增一个为full_status的可读字段，而不是简单覆盖原本可读可写的字段。
    # 意思就是status字段不能与表中的status字段相同，否者会出问题
    status0 = serializers.CharField(source='get_status_display', required=False)
    status1 = serializers.SerializerMethodField()
    class Meta:
        model = models.Article
        fields = ['id', 'title', 'summary', 'content', 'category', 'x1', 'x2', 'status0', 'status1']
        # fields = '__all__'
        # 第一种方法，不推荐，depth后面的值是层级的意思，填几就是几层级
        # depth = 1

    def get_x2(self, obj):
        '''
        :param obj: 指的是每取一行时候这一行的对象
        :return:
        '''
        return obj.category.name

    def get_status1(self, obj):
        return obj.get_status_display()

class NewArticleSerializers(serializers.ModelSerializer):
    tag_info = serializers.SerializerMethodField()
    class Meta:
        model = models.Article
        # fields = '__all__'
        fields = ['title', 'summary', 'tag_info']

    def get_tag_info(self, obj):
        return [row for row in obj.tag.all().values('id', 'title')]

class PostArticleSerializers(serializers.ModelSerializer):

    class Meta:
        model = models.Article
        fields = '__all__'

class PageArticleSerializers(serializers.ModelSerializer):

    class Meta:
        model = models.Article
        fields = '__all__'

class ListArticleSerializers(serializers.ModelSerializer):

    class Meta:
        model = models.Article
        fields = '__all__'

